"""
财务数据可视化工具主应用
基于PRD精简版的界面设计要求
"""

import streamlit as st
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime
import logging

# 导入自定义模块
from config import CHART_CONFIG, SCORE_GRADES
from data_fetcher import data_fetcher
from analysis_engine import value_analyzer
from visualization import financial_visualizer
from database import db_manager

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 页面配置
st.set_page_config(
    page_title="A股财务数据可视化工具",
    page_icon="📊",
    layout="wide",
    initial_sidebar_state="expanded"
)

# 自定义CSS样式
st.markdown("""
<style>
    .main-header {
        font-size: 2.5rem;
        font-weight: bold;
        text-align: center;
        color: #1f77b4;
        margin-bottom: 2rem;
    }
    .metric-card {
        background-color: #f0f2f6;
        padding: 1rem;
        border-radius: 0.5rem;
        border-left: 4px solid #1f77b4;
    }
    .warning-box {
        background-color: #fff3cd;
        border: 1px solid #ffeaa7;
        border-radius: 0.5rem;
        padding: 1rem;
        margin: 1rem 0;
    }
    .success-box {
        background-color: #d4edda;
        border: 1px solid #c3e6cb;
        border-radius: 0.5rem;
        padding: 1rem;
        margin: 1rem 0;
    }
</style>
""", unsafe_allow_html=True)


def main():
    """主应用函数"""
    # 页面标题
    st.markdown('<h1 class="main-header">A股财务数据可视化工具</h1>', unsafe_allow_html=True)
    st.markdown("基于价值投资理念的资产负债表数据分析工具")
    
    # 侧边栏控制面板
    with st.sidebar:
        st.header("📋 控制面板")
        
        # 股票选择
        stock_code = st.text_input(
            "股票代码",
            value="600519",
            help="请输入6位股票代码，如：600519（贵州茅台）"
        )
        
        # 数据刷新选项
        force_refresh = st.checkbox("强制刷新数据", help="忽略缓存，重新获取最新数据")
        
        # 分析按钮
        analyze_button = st.button("🔍 开始分析", type="primary")
        
        # 数据库统计
        st.subheader("📊 数据库统计")
        db_stats = db_manager.get_database_stats()
        st.metric("已缓存股票", db_stats.get('stocks_count', 0))
        st.metric("数据记录数", db_stats.get('balance_sheet_records', 0))
        st.metric("数据库大小", f"{db_stats.get('db_size_mb', 0):.1f} MB")
        
        # 清理缓存
        if st.button("🗑️ 清理缓存"):
            db_manager.cleanup_expired_cache()
            st.success("缓存清理完成")
            st.experimental_rerun()
    
    # 主内容区域
    if analyze_button and stock_code:
        analyze_stock(stock_code, force_refresh)
    else:
        show_welcome_page()


def analyze_stock(stock_code: str, force_refresh: bool = False):
    """分析股票"""
    try:
        # 显示加载状态
        with st.spinner(f"正在获取 {stock_code} 的财务数据..."):
            # 获取数据
            data = data_fetcher.get_balance_sheet_data(stock_code, force_refresh)
            
            if data.empty:
                st.error(f"无法获取股票 {stock_code} 的数据，请检查股票代码是否正确")
                return
        
        # 显示数据概览
        st.success(f"成功获取 {stock_code} 的财务数据")
        
        # 创建标签页
        tab1, tab2, tab3, tab4 = st.tabs(["📊 可视化分析", "🎯 价值投资评分", "📈 关键指标", "📋 详细数据"])
        
        with tab1:
            show_visualization_tab(stock_code, data)
        
        with tab2:
            show_analysis_tab(stock_code, data)
        
        with tab3:
            show_metrics_tab(stock_code, data)
        
        with tab4:
            show_data_tab(data)
            
    except Exception as e:
        st.error(f"分析过程中发生错误: {str(e)}")
        logger.error(f"分析股票 {stock_code} 时发生错误: {e}")


def show_visualization_tab(stock_code: str, data: pd.DataFrame):
    """显示可视化分析标签页"""
    st.subheader("📊 资产负债表结构分析")
    
    # 创建主图表
    chart = financial_visualizer.create_balance_sheet_chart(data, stock_code)
    st.plotly_chart(chart, use_container_width=True)
    
    # 数据概览
    col1, col2, col3 = st.columns(3)
    
    with col1:
        st.metric("数据期间数", len(data['报告日期'].unique()))
    
    with col2:
        latest_date = data['报告日期'].max()
        st.metric("最新报告期", latest_date.strftime('%Y-%m-%d'))
    
    with col3:
        total_records = len(data)
        st.metric("数据记录数", total_records)


def show_analysis_tab(stock_code: str, data: pd.DataFrame):
    """显示价值投资分析标签页"""
    st.subheader("🎯 价值投资综合评分")
    
    with st.spinner("正在进行价值投资分析..."):
        # 进行分析
        analysis_result = value_analyzer.analyze_stock(stock_code, data)
        
        if not analysis_result:
            st.error("分析失败，请稍后重试")
            return
    
    # 显示综合评分
    scores = analysis_result.get('scores', {})
    total_score = scores.get('total_score', 0)
    grade = scores.get('grade', {})
    
    # 评分仪表盘
    col1, col2 = st.columns([1, 1])
    
    with col1:
        gauge_chart = financial_visualizer.create_score_gauge_chart(total_score, grade)
        st.plotly_chart(gauge_chart, use_container_width=True)
    
    with col2:
        st.markdown("### 📋 评分详情")
        st.markdown(f"**综合评分**: {total_score:.1f} 分")
        st.markdown(f"**评级**: {grade.get('grade', 'N/A')} - {grade.get('description', 'N/A')}")
        
        # 分项评分
        st.markdown("#### 分项评分")
        st.progress(scores.get('asset_quality', {}).get('total_score', 0) / 100)
        st.caption(f"资产质量: {scores.get('asset_quality', {}).get('total_score', 0):.1f} 分")
        
        st.progress(scores.get('financial_safety', {}).get('total_score', 0) / 100)
        st.caption(f"财务安全: {scores.get('financial_safety', {}).get('total_score', 0):.1f} 分")
        
        st.progress(scores.get('growth_potential', {}).get('total_score', 0) / 100)
        st.caption(f"成长潜力: {scores.get('growth_potential', {}).get('total_score', 0):.1f} 分")
    
    # 风险预警
    risk_warnings = analysis_result.get('risk_warnings', [])
    if risk_warnings:
        st.markdown("### ⚠️ 风险预警")
        for warning in risk_warnings:
            st.markdown(f'<div class="warning-box">⚠️ {warning}</div>', unsafe_allow_html=True)
    
    # 投资建议
    investment_advice = analysis_result.get('investment_advice', '')
    if investment_advice:
        st.markdown("### 💡 投资建议")
        st.markdown(f'<div class="success-box">💡 {investment_advice}</div>', unsafe_allow_html=True)


def show_metrics_tab(stock_code: str, data: pd.DataFrame):
    """显示关键指标标签页"""
    st.subheader("📈 关键财务指标")
    
    # 获取分析结果
    analysis_result = value_analyzer.analyze_stock(stock_code, data)
    metrics = analysis_result.get('basic_metrics', {})
    
    if not metrics:
        st.warning("暂无指标数据")
        return
    
    # 关键指标卡片
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        st.markdown('<div class="metric-card">', unsafe_allow_html=True)
        st.metric("资产负债率", f"{metrics.get('debt_ratio', 0):.1%}")
        st.markdown('</div>', unsafe_allow_html=True)
    
    with col2:
        st.markdown('<div class="metric-card">', unsafe_allow_html=True)
        st.metric("流动比率", f"{metrics.get('current_ratio', 0):.2f}")
        st.markdown('</div>', unsafe_allow_html=True)
    
    with col3:
        st.markdown('<div class="metric-card">', unsafe_allow_html=True)
        st.metric("现金比例", f"{metrics.get('cash_ratio', 0):.1%}")
        st.markdown('</div>', unsafe_allow_html=True)
    
    with col4:
        st.markdown('<div class="metric-card">', unsafe_allow_html=True)
        st.metric("应收账款占比", f"{metrics.get('receivables_ratio', 0):.1%}")
        st.markdown('</div>', unsafe_allow_html=True)
    
    # 雷达图
    st.markdown("### 📊 指标雷达图")
    radar_chart = financial_visualizer.create_metrics_comparison_chart(metrics)
    st.plotly_chart(radar_chart, use_container_width=True)
    
    # 详细指标表
    st.markdown("### 📋 详细指标")
    metrics_df = pd.DataFrame([
        {"指标名称": "总资产", "数值": f"{metrics.get('total_assets', 0)/100000000:.2f} 亿元"},
        {"指标名称": "总负债", "数值": f"{metrics.get('total_liabilities', 0)/100000000:.2f} 亿元"},
        {"指标名称": "所有者权益", "数值": f"{metrics.get('total_equity', 0)/100000000:.2f} 亿元"},
        {"指标名称": "流动资产", "数值": f"{metrics.get('current_assets', 0)/100000000:.2f} 亿元"},
        {"指标名称": "流动负债", "数值": f"{metrics.get('current_liabilities', 0)/100000000:.2f} 亿元"},
        {"指标名称": "速动比率", "数值": f"{metrics.get('quick_ratio', 0):.2f}"},
        {"指标名称": "有息负债占比", "数值": f"{metrics.get('interest_debt_ratio', 0):.1%}"},
    ])
    st.dataframe(metrics_df, use_container_width=True)


def show_data_tab(data: pd.DataFrame):
    """显示详细数据标签页"""
    st.subheader("📋 详细财务数据")
    
    # 数据过滤选项
    col1, col2 = st.columns(2)
    
    with col1:
        # 日期过滤
        unique_dates = sorted(data['报告日期'].unique(), reverse=True)
        selected_dates = st.multiselect(
            "选择报告期",
            options=unique_dates,
            default=unique_dates[:3] if len(unique_dates) >= 3 else unique_dates
        )
    
    with col2:
        # 分类过滤
        unique_categories = sorted(data['category'].unique())
        selected_categories = st.multiselect(
            "选择科目分类",
            options=unique_categories,
            default=unique_categories
        )
    
    # 过滤数据
    filtered_data = data[
        (data['报告日期'].isin(selected_dates)) &
        (data['category'].isin(selected_categories))
    ]
    
    # 显示过滤后的数据表
    if not filtered_data.empty:
        display_data = financial_visualizer.create_data_table(filtered_data)
        st.dataframe(display_data, use_container_width=True)
        
        # 数据导出
        csv = display_data.to_csv(index=False, encoding='utf-8-sig')
        st.download_button(
            label="📥 下载CSV文件",
            data=csv,
            file_name=f"financial_data_{datetime.now().strftime('%Y%m%d')}.csv",
            mime="text/csv"
        )
    else:
        st.warning("没有符合条件的数据")


def show_welcome_page():
    """显示欢迎页面"""
    st.markdown("## 👋 欢迎使用A股财务数据可视化工具")
    
    col1, col2 = st.columns(2)
    
    with col1:
        st.markdown("""
        ### 🎯 产品特色
        - **专业性**: 基于巴菲特、格雷厄姆价值投资框架
        - **直观性**: 堆叠柱状图可视化呈现财务结构
        - **实用性**: 本地SQLite缓存，高效数据获取
        - **系统性**: 完整的价值投资评分体系
        """)
    
    with col2:
        st.markdown("""
        ### 📊 主要功能
        - 资产负债表可视化分析
        - 价值投资综合评分
        - 关键财务指标监控
        - 风险预警和投资建议
        """)
    
    st.markdown("""
    ### 🚀 快速开始
    1. 在左侧输入6位股票代码（如：600519）
    2. 点击"开始分析"按钮
    3. 查看可视化图表和分析结果
    
    ### ⚠️ 免责声明
    本工具仅供学习和研究使用，分析结果仅供参考，不构成投资建议。投资有风险，决策需谨慎。
    """)


if __name__ == "__main__":
    main()
